package cn.tedu.picture;

import java.util.*;

/**
 * 在图像处理中，卷积是常用的技术，现有P(h,w)的的图片，像素值为[0, 255]的整数。卷积核为K(m, m)的矩阵，元素值为[0, 1.]的浮点数，输出图像大小为O(h - m + 1, w - m + 1)，其中h>=m, w>=m。卷积后中的图片O元素值计算如下，其中最后的输出像素值为向下取整的整数
 * O(i, j) = min(Σ(x=0 to x=m-1)Σ(y=0 to y=m-1)(P(i + x, j + y) * K(x, y)), 255)
 * 现输入图片P和卷积核K，输出卷积后的图片O，图片按行输出，行内空格分隔。
 * 第1行输入图片的大小h、w由空格分隔。
 * 第2行到h+1行输入由空格分隔的w个像素值。
 * 第h+2输入卷积核大小m。
 * 第h+3行到h+2+m行输入由空格分隔的m卷积核值
 *
 * 输入描述:
 * 第1行输入图片的大小h、w由空格分隔。
 * 第2行到h+1行输入由空格分隔的w个像素值。
 * 第h+2输入卷积核大小m。
 * 第h+3行到h+2+m行输入由空格分隔的m卷积核值。
 *
 * 输出描述:
 * 图片按行输出，行内空格分隔
 *
 * 输入例子1:
 * 3 3
 * 40 24 135
 * 200 239 238
 * 90 34 94
 * 2
 * 0.0 0.6
 * 0.1 0.3
 *
 * 输出例子1:
 * 106 176
 * 162 174
 */
public class Convolution {
    public static void main(String[] args) {
        // int[][] wh = new int[640][960];
        // System.out.println(wh.length);
        // System.out.println(wh[0].length);

        Scanner input = new Scanner(System.in);
        int h = input.nextInt();
        int w = input.nextInt();
        int[][] pixels = new int[h][w];
        for (int y = 0; y < h; y++) {
            for (int x = 0; x < w; x++) {
                pixels[y][x] = input.nextInt();
            }
        }

        int m = input.nextInt();
        float[][] K = new float[m][m];
        for (int y = 0; y < m; y++) {
            for (int x = 0; x < m; x++) {
                K[y][x] = input.nextFloat();
            }
        }

        int[][] O = new int[pixels.length - m + 1][pixels[0].length - m + 1];
        for (int j = 0; j < O.length; j++) {
            for (int i = 0; i < O[0].length; i++) {
                float total = 0;
                for (int y = 0; y < m; y++) {
                    for (int x = 0; x < m; x++) {
                        total += ((float) pixels[j + y][i + x]) * K[y][x];
                    }
                }
                O[j][i] = Math.min((int) total, 255);
            }
        }

        for (int y = 0; y < O.length; y++) {
            StringBuilder stringBuilder = new StringBuilder();
            for (int x = 0; x < O[0].length; x++) {
                stringBuilder.append(O[y][x]);
                if (x < O[0].length - 1)
                    stringBuilder.append(" ");
            }
            System.out.println(stringBuilder.toString());
        }
    }
}
